<?php

namespace JsonLowCode\UI;

use JsonLowCode\Schema;
use JsonLowCode\Traits\Events\HasOnUpdateValue;
use JsonLowCode\Traits\Props\HasDefaultValue;
use JsonLowCode\Traits\Props\HasDisabled;
use JsonLowCode\Traits\Props\HasModel;
use JsonLowCode\Traits\Props\HasValue;

class DynamicInput extends Schema
{
    protected string $componentName = "NDynamicInput";

    use HasValue, HasModel, HasDefaultValue, HasDisabled;

    use HasOnUpdateValue;

    /**
     * 最少有几项内容
     * @param string|int|float $min
     * @return $this
     */
    public function min(string|int|float $min = 0): static
    {
        return $this->prop("min",$min);
    }

    /**
     * 最多有几项内容
     * @param string|int|float $max
     * @return $this
     */
    public function max(string|int|float $max = 100): static
    {
        return $this->prop("max",$max);
    }

    /**
     * 动态录入中每项的样式
     * @param string|array $itemStyle
     * @return $this
     */
    public function itemStyle(string|array $itemStyle): static
    {
        return $this->prop("item-style",$itemStyle);
    }


    /**
     * 每一项的 key 值，会被用于列表渲染中
     * @param string $value
     * @return $this
     */
    public function keyField(string $value): static
    {
        return $this->prop("key-field",$value);
    }


    /**
     * 动态录入使用的预设，在不设定 $slots.default 的时候生效
     * @param string $value 'input' | 'pair'
     * @return $this
     */
    public function preset(string $value = 'input' | 'pair'): static
    {
        return $this->prop("preset",$value);
    }

    /**
     * 是否显示排序按钮
     * @param string|bool $bool
     * @return $this
     */
    public function showSortButton(string|bool $bool = true): static
    {
        return $this->prop("show-sort-button",$bool);
    }

    /**
     * 文本输入的占位符 如果 pair 是 true，placeholder是一个数组
     * @param string|array $placeholder
     * @return $this
     */
    public function placeholder(string|array $placeholder = ''): static
    {
        return $this->prop("placeholder",$placeholder);
    }

    /**
     * 文本输入的占位符 如果 pair 是 true，placeholder是一个数组
     * @param string|array $placeholder
     * @return $this
     */
    public function keyPlaceholder(string|array $placeholder = ''): static
    {
        return $this->prop("keyPlaceholder",$placeholder);
    }


    /**
     * 文本输入的占位符 如果 pair 是 true，placeholder是一个数组
     * @param string|array $placeholder
     * @return $this
     */
    public function valuePlaceholder(string|array $placeholder = ''): static
    {
        return $this->prop("valuePlaceholder",$placeholder);
    }



    /**
     * 点击添加按钮时的回调，如果设定则返回值会被用作新添加的初始值。其中 index 是创建内容将要被放置到的位置对应的数组索引，从 1（第二项）开始计算
     * @param string $value 函数 (index:number) => void
     * @return $this
     */
    public function onCreate(string $value = "(index)=>{ }"): static
    {
        return $this->events("onCreate",$value);
    }

    /**
     * 点击第 index 项删除按钮的回调
     * @param string $value 函数 (index:number) => void
     * @return $this
     */
    public function onRemove(string $value = "(index)=>{ }"): static
    {
        return $this->events("onRemove",$value);
    }

    /**
     * 新建项按钮的属性
     * @param string|array|Button $value 函数 (index:number) => void
     * @return $this
     */
    public function createButtonProps(string|array|Button $value = []): static
    {
        $isJSExpression = false;
        if ($value instanceof Button){
            $value = $value->getProps();
        }elseif (is_string($value)){
            $isJSExpression = true;
        }
        return $this->prop("createButtonProps",$value);
    }


}
